#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import asyncio
from typing import List

from agentscope.agent import AgentBase
from agentscope.message import Msg
from agentscope.model import DashScopeChatModel
from agentscope.formatter import DashScopeChatFormatter
from agentscope.memory import InMemoryMemory

from src.utils.env_config import aliyun_model_config


class CaseAnalyzerAgent(AgentBase):
    """T5 - 技术案例分析智能体"""

    def __init__(self):
        super().__init__()
        self.name = "CaseAnalyzerAgent"
        self.sys_prompt = """你是一个技术案例分析智能体。你的任务是从文献检索结果中识别并分析提及的"技术突破"或"创新案例"。
        要求：
        1. 基于提供的检索摘要，提取至少一个具体的技术创新实例；
        2. 描述该案例的技术原理、应用场景及行业影响；
        3. 内容长度不少于80字；
        4. 语言专业、客观，适合写入正式报告；
        5. 不得虚构未在检索结果中提及的技术；
        6. 输出格式必须为JSON，仅包含一个字段"case_analysis"，值为字符串；
        7. 不要解释过程，不要添加额外内容。
        示例输出：
        {
        "case_analysis": "2025年Q3，Google DeepMind发布新型稀疏化训练架构。该技术已在医疗影像分析场景中验证，显著提升边缘设备部署效率，为AI技术的普及应用奠定了重要基础。"
        }"""

        self.model = DashScopeChatModel(
            model_name=aliyun_model_config["model_name"],
            api_key=aliyun_model_config["api_key"],
            stream=False
        )
        self.formatter = DashScopeChatFormatter()
        self.memory = InMemoryMemory()

    async def reply(self, msg: Msg) -> Msg:
        """处理技术案例分析请求"""
        await self.memory.add(msg)

        # 准备提示
        prompt = await self.formatter.format([
            Msg("system", self.sys_prompt, "system"),
            msg
        ])

        # 调用模型
        response = await self.model(prompt)

        # 创建回复消息
        reply_msg = Msg(
            name=self.name,
            content=response.content,
            role="assistant"
        )

        await self.memory.add(reply_msg)
        return reply_msg

    async def analyze_technical_cases(self, retrieval_summary: str, keywords: List[str], abstract: str = None) -> str:
        """
        基于文献检索结果中提到的"技术突破"或"创新案例"，提取并分析具体技术应用实例
        Args:
            retrieval_summary: 来自T2的检索结果摘要
            keywords: 来自T1的关键词列表
            abstract: 来自T3的摘要（可选）
        Returns:
            str: 技术案例分析结果
        """
        # 构建用户输入
        user_content = f"现在开始处理：\n检索结果摘要：{retrieval_summary}\n关键词列表：{keywords}"
        
        if abstract:
            user_content += f"\n摘要内容：{abstract}"

        user_msg = Msg(
            name="user",
            content=user_content,
            role="user"
        )

        response_msg = await self.reply(user_msg)
        
        try:
            # 提取文本内容
            content_text = ""
            if isinstance(response_msg.content, list):
                for block in response_msg.content:
                    if hasattr(block, 'text'):
                        content_text += block.text
                    elif isinstance(block, dict) and 'text' in block:
                        content_text += block['text']
            else:
                content_text = str(response_msg.content)

            result = json.loads(content_text)
            case_analysis = result.get("case_analysis", "")
            return case_analysis
            
        except json.JSONDecodeError:
            print(f"JSON解析失败:{response_msg.content}")
            return ""

    def should_trigger(self, retrieval_summary: str) -> bool:
        """
        判断是否需要触发技术案例分析
        Args:
            retrieval_summary: 检索结果摘要
        Returns:
            bool: 是否需要执行T5任务
        """
        tech_keywords = ["技术突破", "创新案例", "技术创新", "突破性技术", "新技术", "技术进展", "创新应用", "技术发展"]
        # 检查是否包含技术创新相关关键词
        for keyword in tech_keywords:
            if keyword in retrieval_summary:
                return True
        
        return False

    async def observe(self, msg: Msg) -> None:
        """观察消息"""
        await self.memory.add(msg)

    async def handle_interrupt(self) -> Msg:
        """处理中断"""
        return Msg(
            name=self.name,
            content="技术案例分析任务被中断",
            role="assistant"
        )
